#pragma once 
#include <string>
#include <memory>
#include <sys/epoll.h>
// #include "EventLoop.h" //避免交叉引用，所以就需要在Event.cpp中才引用头文件
namespace tmms
{
    namespace network
    {
        class EventLoop; //避免交叉引用，所以这里前置声明
        const int KEventRead = (EPOLLIN|EPOLLPRI|EPOLLET);
        /*这行代码定义了一个组合事件标志，用于 ​​Linux 的 epoll 事件监听机制​​，
        其作用是将三种事件类型合并为一个逻辑单元，​
        ​高效监听可读事件（包括普通数据和紧急数据），并采用边缘触发模式（ET）​​
        */
       const int KEventWrite = (EPOLLOUT|EPOLLET);

        class Event:public std::enable_shared_from_this<Event> //这样之后才能自己用到自己的智能指针
        {
            friend class EventLoop; //只有是友元类了它才能给event_设置值，不然会就设置一个接口bie
        public:
            Event(/* args */);
            Event(EventLoop *loop);
            Event(EventLoop *loop,int fd);
            virtual ~Event();

            virtual void OnRead() {}; //设置为虚函数而不是纯虚函数，虚函数：若是子类重写，就默认选择父类的
            virtual void OnWrite() {};
            virtual void OnClose() {};
            virtual void OnError(const std::string &msg) {};

            bool EnableWriting (bool enable);
            bool EnableReading(bool enable);
            int Fd() const;
            void Close();
                   
        protected:
            EventLoop * loop_{nullptr}; //??? 为了通过事件循环注册/修改/删除自身的事件监听（例如调用 EnableReading()）
             int fd_{-1};
        private:
            int event_{0};
        };
    } 
}